﻿Public Class FunGenerales

    Public Function ValidarRut(ByVal szRut_bruto As String, ByRef lRut As Integer, ByRef szDv As String) As Boolean
        '###################################################################
        ' Rutina de validación de RUT
        ' Fecha    :   08 de Julio de 1996
        ' Autor    :   

        'El único -parámetro de entrada es el string
        'de el szRUT en

        'Como resultado entraga TRUE si el rut es correcto y
        'FALSE si no lo es.
        'szRut_Bruto : En rut Bruto se regresa el rut formateado
        'numericamente, con letra "k" en mayúscula y con el guión
        'separador.
        'rut : regresa la parte numérica de el rut
        'dv  : regrasa el digito verificador

        'No tiene problemas en cuanto al paso de RUT nulo o con
        'blancos, tampoco reviste problema al enviar un rut con
        'separador de miles y guión.

        'Nota : Se modificó a pedido de M.X. para aceptar dígito verificador "W"
        '###################################################################

        Dim szdigito_aux As String, szrut_depurado As String, szdigito_correcto As String, szrut_completo As String
        Dim i As Integer, iFactor As Integer, iSuma As Integer, iRutVer As Integer


        ValidarRut = False

        szrut_bruto = UCase(szrut_bruto.Replace(".", "").Replace("-", ""))
        For i = 1 To Len(szrut_bruto)
            szdigito_aux = Mid(szrut_bruto, i, 1)
            If (Asc(szdigito_aux) <= 57 And Asc(szdigito_aux) >= 48) Or szdigito_aux = "K" Or szdigito_aux = "W" Then
                szrut_depurado = szrut_depurado & szdigito_aux
            End If
        Next

        szrut_completo = szrut_depurado

        ' Validación de largo mínimo
        If Len(szrut_completo) <= 1 Then
            'MsgBox "Debe ingresar a lo menos dos dígitos", 64, szTitAplicacion
            Exit Function
        End If

        If Val(Mid(szrut_completo, 1, Len(szrut_completo) - 1)) <= 0 Then
            Anthem.Manager.AddScriptForClientSideEval("alert('Debe Ingresar un Rut Válido');")
            Exit Function
        End If

        lRut = Val(Mid(szrut_completo, 1, Len(szrut_completo) - 1))
        szDv = Mid$(szrut_completo, Len(szrut_completo), 1)

        If lRut > 49999999 Then
            Anthem.Manager.AddScriptForClientSideEval("alert('No se puede ingresar Rut Empresa');")

            lRut = 0
            szDv = " "
            Exit Function
        End If

        ' Despliego rut con separador de miles y raya
        szrut_completo = Format$(lRut, "###,###,###") + "-" + szDv
        szrut_bruto = szrut_completo

        ' Busco dígito verificador correcto
        iSuma = 0
        iFactor = 2
        For i = Len(Str(lRut)) To 1 Step -1
            iSuma = iSuma + Val(Mid$(Str(lRut), i, 1)) * iFactor
            If iFactor = 7 Then
                iFactor = 2
            Else
                iFactor = iFactor + 1
            End If
        Next i
        iRutVer = (11 - (iSuma Mod 11)) Mod 11
        If iRutVer = 10 Then
            szdigito_correcto = "K"
        Else
            szdigito_correcto = LTrim$(Str$(iRutVer))
        End If

        ' Comparo dígito verificador recibido como
        ' parámetro con digito verificador correcto
        If szDv = szdigito_correcto Or szDv = "W" Then
            ValidarRut = True
        Else

            Anthem.Manager.AddScriptForClientSideEval("alert('! Rut Inválido, verifique ¡');")
        End If

    End Function

End Class
